home *** CD-ROM | disk | FTP | other *** search
/ EuroCD 3 / EuroCD 3.iso / Games / Doom / ADoom-0.8 / ADoom_src / c2p_020.s < prev    next >
Text File  |  1998-06-24  |  21KB  |  812 lines

  1.         mc68020
  2.         multipass
  3.     if (_eval(DEBUG)&$8000)
  4.         debug    on,lattice4
  5.     endc
  6.  
  7. ; ---------------------------------------------------------------------
  8.  
  9. ; void __asm c2p_020 (register __a2 UBYTE *fBUFFER,
  10. ;                     register __a4 PLANEPTR *planes,
  11. ;                     register __d0 ULONG signals1,
  12. ;                     register __d1 ULONG signals2,
  13. ;                     register __d4 ULONG signals3,
  14. ;                     register __d2 ULONG pixels,     // width*height
  15. ;                     register __d3 ULONG offset,     // byte offset into plane
  16. ;                     register __a1 UBYTE *xlate,
  17. ;                     register __a5 struct Task *othertask);
  18. ;
  19. ; Pipelined CPU+blitter 8-plane chunky to planar converter.
  20. ; Optimised for 68020/30 with fastmem.
  21. ;
  22. ; Author: Peter McGavin (e-mail peterm@maths.grace.cri.nz), 21 April 1994
  23. ; Based on James McCoull's 4-pass blitter algorithm.
  24. ;
  25. ; This code is public domain.
  26. ;
  27. ; Perform first 2 merges (Fast->Chip) with the CPU (in 1 pass).
  28. ; Wait for previous QBlit() to completely finish (signals2).
  29. ; Then launch merge passes 3 & 4 with QBlit().
  30. ; Return immediately after launching passes 3 & 4.
  31. ; Signal this task signals1 (asynchronously) after completion of pass 3.
  32. ; Signal this task signals2 from CleanUp() on completion of QBlit().
  33. ; Also signal othertask signals3 from CleanUp() on completion of QBlit().
  34. ; Calling task must wait for signals1 before next call to c2p_020()
  35. ;
  36. ; (Unimplemented speedup idea: use a "scrambled" chunky buffer.
  37. ; Skip pass 1.)
  38. ;
  39. ; Example usage:
  40. ;
  41. ;    /* clear fBUFFER, fBUFFER_CMP, and planes here */
  42. ;    if ((sigbit1 = AllocSignal(-1)) == -1 ||
  43. ;        (sigbit2 = AllocSignal(-1)) == -1)
  44. ;        die ("Can't allocate signal!\n");
  45. ;    SetSignal ((1<<sigbit1)|(1<<sigbit2),  // initial state is "finished"
  46. ;           (1<<sigbit1)|(1<<sigbit2));
  47. ;    for (;;) {
  48. ;        /* render to fBUFFER here */
  49. ;        Wait (1<<sigbit1);  // wait for prev c2p8() to finish pass 3
  50. ;            c2p8 (fBUFFER, &RASTPORT->BitMap->Planes[0],
  51. ;              1<<sigbit1, 1<<sigbit2, WIDTH*HEIGHT,
  52. ;                     WIDTH/8*LINESTOSKIP, xlate);
  53. ;    }
  54. ;    Wait (1<<sigbit1);  // wait for last c2p8 to finish pass 3
  55. ;    Wait (1<<sigbit2);  // wait for last c2p8 to completely finish
  56. ;    FreeSignal(sigbit1);
  57. ;    FreeSignal(sigbit2);
  58. ;
  59. ; ---------------------------------------------------------------------
  60.  
  61.         xref    _GfxBase
  62.  
  63. maxwidth    equ    320    ; must be a multiple of 32
  64. maxheight    equ    200
  65. maxpixels    equ    maxwidth*maxheight
  66.  
  67. cleanup        equ    $40
  68.  
  69. xload        macro    ; translate 4 8-bit pixels to 6-bit EHB using xlate[]
  70.         move.b    (\1,a2),d4
  71.         move.b    (a6,d4.w),\2
  72.         lsl.w    #8,\2
  73.         move.b    (\1+8,a2),d4
  74.         move.b    (a6,d4.w),\2
  75.         swap    \2
  76.         move.b    (\1+2,a2),d4
  77.         move.b    (a6,d4.w),\2
  78.         lsl.w    #8,\2
  79.         move.b    (\1+10,a2),d4
  80.         move.b    (a6,d4.w),\2
  81.         endm
  82.  
  83. ;        section chunks,code
  84.  
  85.     ifeq    depth-8
  86.         xdef    _c2p_8_020
  87. _c2p_8_020:
  88.     else
  89.     ifeq    depth-6
  90.         xdef    _c2p_6_020
  91. _c2p_6_020:
  92.     else
  93.         fail    "unsupported depth!"
  94.     endc
  95.     endc
  96.         movem.l    d2-d7/a2-a6,-(sp)
  97.  
  98. ; save arguments
  99.  
  100.         move.l    #mybltnode,a0
  101.         move.l    a5,(othertask-mybltnode,a0)
  102.         move.l    a2,(chunky-mybltnode,a0)
  103.         move.l    a4,(planes-mybltnode,a0)
  104.         move.l    d0,(signals1-mybltnode,a0)
  105.         move.l    d1,(signals2-mybltnode,a0)
  106.         move.l    d4,(signals3-mybltnode,a0)
  107.         move.l    d2,(pixels-mybltnode,a0)
  108.         lsr.l    #1,d2
  109.         move.l    d2,(pixels2-mybltnode,a0)
  110.         lsr.l    #1,d2
  111.         move.l    d2,(pixels4-mybltnode,a0)
  112.         lsr.l    #1,d2
  113.         move.l    d2,(pixels8-mybltnode,a0)
  114.         lsr.l    #1,d2
  115.         move.l    d2,(pixels16-mybltnode,a0)
  116.         move.l    d3,(offset-mybltnode,a0)
  117.     IFLE depth-6
  118.         move.l    a1,(xlate-mybltnode,a0)
  119.     ENDC
  120.  
  121. ;-------------------------------------------------
  122. ;original chunky data
  123. ;0        a7a6a5a4a3a2a1a0 b7b6b5b4b3b2b1b0
  124. ;2        c7c6c5c4c3c2c1c0 d7d6d5d4d3d2d1d0
  125. ;4        e7e6e5e4e3e2e1e0 f7f6f5f4f3f2f1f0
  126. ;6        g7g6g5g4g3g2g1g0 h7h6h5h4h3h2h1h0
  127. ;8        i7i6i5i4i3i2i1i0 j7j6j5j4j3j2j1j0
  128. ;10        k7k6k5k4k3k2k1k0 l7l6l5l4l3l2l1l0
  129. ;12        m7m6m5m4m3m2m1m0 n7n6n5n4n3n2n1n0
  130. ;14        o7o6o5o4o3o2o1o0 p7p6p5p4p3p2p1p0
  131. ;16        q7q6q5q4q3q2q1q0 r7r6r5r4r3r2r1r0
  132. ;18        s7s6s5s4s3s2s1s0 t7t6t5t4t3t2t1t0
  133. ;20        u7u6u5u4u3u2u1u0 v7v6v5v4v3v2v1v0
  134. ;22        w7w6w5w4w3w2w1w0 x7x6x5x4x3x2x1x0
  135. ;24        y7y6y5y4y3y2y1y0 z7z6z5z4z3z2z1z0
  136. ;26        A7A6A5A4A3A2A1A0 B7B6B5B4B3B2B1B0
  137. ;28        C7C6C5C4C3C2C1C0 D7D6D5D4D3D2D1D0
  138. ;30        E7E6E5E4E3E2E1E0 F7F6F5F4F3F2F1F0
  139. ;-------------------------------------------------
  140.  
  141.         move.l    (pixels16-mybltnode,a0),d6 ; loop count = pixels/16
  142.  
  143.     IFLE depth-6
  144.         move.l    (xlate-mybltnode,a0),a6    ; a6 -> xlate
  145.     ENDC
  146.         move.l    (pixels4-mybltnode,a0),d0
  147.         move.l    #buff2,a0    ; a0 -> buff2 (in Chip)
  148.         lea    (a0,d0.l),a1    ; a1 -> buff2+pixels/4
  149.         lea    (a1,d0.l),a4    ; a4 -> buff2+pixels/2
  150.         lea    (a4,d0.l),a5    ; a5 -> buff2+3*pixels/4
  151.  
  152.         move.l    #$0f0f0f0f,d7    ; constant
  153.         move.l    #$00ff00ff,d5    ; constant
  154.  
  155.     IFGT depth-6            ; 8-plane version
  156.         subq.w    #1,d6
  157.         movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  158.         move.l    d2,d4
  159.         lsr.l    #8,d4
  160.         eor.l    d0,d4
  161.         and.l    d5,d4
  162.         eor.l    d4,d0
  163.         lsl.l    #8,d4
  164.         eor.l    d4,d2
  165.         move.l    d3,d4
  166.         lsr.l    #8,d4
  167.         eor.l    d1,d4
  168.         and.l    d5,d4
  169.         eor.l    d4,d1
  170.         lsl.l    #8,d4
  171.         eor.l    d4,d3
  172.         move.l    d1,d4
  173.         lsr.l    #4,d4
  174.         bra    start8
  175.     ELSE
  176.         bra    end_pass1loop
  177.     ENDC
  178.  
  179.         cnop    0,4
  180.  
  181. ; main loop (starts here) processes 16 chunky pixels at a time
  182. ; convert 16 pixels (passes 1 and 2 combined)
  183.  
  184.     IFGT depth-6            ; 8-plane version
  185.  
  186. mainloop:    movem.l    (a2)+,d0-d3    ; AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp
  187.  
  188.         move.l    d4,(a4)+
  189.  
  190.         move.l    d2,d4
  191.         lsr.l    #8,d4
  192.         eor.l    d0,d4
  193.         and.l    d5,d4
  194.         eor.l    d4,d0
  195.         lsl.l    #8,d4
  196.         eor.l    d4,d2
  197.         move.l    d3,d4
  198.  
  199.         move.l    a6,(a1)+
  200.  
  201.         lsr.l    #8,d4
  202.         eor.l    d1,d4
  203.         and.l    d5,d4
  204.         eor.l    d4,d1
  205.         lsl.l    #8,d4
  206.         eor.l    d4,d3
  207.         move.l    d1,d4
  208.         lsr.l    #4,d4
  209.  
  210.         move.l    a3,(a5)+
  211.  
  212. start8:        eor.l    d0,d4
  213.         and.l    d7,d4
  214.         eor.l    d4,d0        ; d0=AEIMCGKO
  215.         lsl.l    #4,d4
  216.         eor.l    d1,d4        ; d4=aeimcgko
  217.         move.l    d3,d1
  218.         lsr.l    #4,d1
  219.         eor.l    d2,d1
  220.  
  221.         move.l    d0,(a0)+
  222.  
  223.         and.l    d7,d1
  224.         eor.l    d1,d2
  225.         lsl.l    #4,d1
  226.         eor.l    d1,d3
  227.         movea.l    d2,a6        ; a6=BFJNDHLP
  228.         movea.l    d3,a3        ; a3=bfjndhlp
  229.  
  230. end_pass1loop:    dbra    d6,mainloop
  231.  
  232.         move.l    d4,(a4)+
  233.         move.l    a6,(a1)+
  234.         move.l    a3,(a5)+
  235.  
  236.     ELSE                ; 6-plane version with pixel xlate table
  237.  
  238. mainloop:    moveq    #0,d4
  239.         xload    0,d0        ; d0=xlate[AaIiCcKk]
  240.         xload    4,d1        ; d1=xlate[EeMmGgOo]
  241.         xload    1,d2        ; d2=xlate[BbJjDdLl]
  242.         xload    5,d3        ; d3=xlate[FfNnHhPp]
  243.         adda.w    #16,a2
  244.  
  245.         move.l    d1,d4
  246.         lsr.l    #4,d4
  247.         eor.l    d0,d4
  248.         and.l    d7,d4
  249.         eor.l    d4,d0        ; d0=AEIMCGKO
  250.  
  251.         move.l    d0,(a0)+
  252.  
  253.         lsl.l    #4,d4
  254.         eor.l    d4,d1        ; d1=aeimcgko
  255.         move.l    d3,d4
  256.         lsr.l    #4,d4
  257.  
  258.         move.l    d1,(a4)+
  259.  
  260.         eor.l    d2,d4
  261.         and.l    d7,d4
  262.         eor.l    d4,d2        ; d2=BFJNDHLP
  263.  
  264.         move.l    d2,(a1)+
  265.  
  266.         lsl.l    #4,d4
  267.         eor.l    d4,d3        ; d3=bfjndhlp
  268.  
  269.         move.l    d3,(a5)+
  270.  
  271. end_pass1loop:    dbra    d6,mainloop
  272.  
  273.     ENDC
  274.  
  275. ; wait until previous QBlit() has completely finished (signals2)
  276. ; then start the blitter in the background for passes 3 & 4
  277.  
  278. done:        move.l    #mybltnode,a2    ; a2->mybltnode
  279.         move.l    (4).w,a6    ; a6->SysBase
  280.         move.l    (ThisTask,a6),(task-mybltnode,a2) ; save task ptr
  281.         move.l    (signals2-mybltnode,a2),d0
  282.         jsr    (_LVOWait,a6)
  283.  
  284.         move.l    a2,a1
  285.         move.l    (_GfxBase),a6
  286.         jsr    (_LVOQBlit,a6)
  287.  
  288. ret:        movem.l    (sp)+,d2-d7/a2-a6
  289.         rts
  290.  
  291. ;-----------------------------------------------------------------------------
  292. ; QBlit functions (called asynchronously)
  293.  
  294. ;-------------------------------------------------
  295. ;buff2 after pass 2
  296. ;0        a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4
  297. ;2        c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4
  298. ;4        q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  299. ;6        s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  300. ;
  301. ;Pixels/4+0    b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4
  302. ;Pixels/4+2    d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4
  303. ;Pixels/4+4    r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  304. ;Pixels/4+6    t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  305. ;
  306. ;Pixels/2+0    a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0
  307. ;Pixels/2+2    c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
  308. ;Pixels/2+4    q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  309. ;Pixels/2+6    s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  310. ;
  311. ;3*Pixels/4+0    b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0    
  312. ;3*Pixels/4+2    d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
  313. ;3*Pixels/4+4    r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  314. ;3*Pixels/4+6    t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  315. ;-------------------------------------------------
  316.  
  317. ;Pass 3, subpass 1
  318. ;    apt        Buff2
  319. ;    bpt        Buff2+2
  320. ;    dpt        Buff3
  321. ;    amod        2
  322. ;    bmod        2
  323. ;    dmod        0
  324. ;    cdat        $cccc
  325. ;    sizv        Pixels/4
  326. ;    sizh        1 word
  327. ;    con        D=AC+(B>>2)~C, ascending
  328.  
  329. blit31:        moveq    #-1,d0
  330.         move.l    d0,(bltafwm,a0)
  331.         move.w    #0,(bltdmod,a0)
  332.         move.l    #buff2,(bltapt,a0)
  333.         move.l    #buff2+2,(bltbpt,a0)
  334.         move.l    #buff3,(bltdpt,a0)
  335.         move.w    #2,(bltamod,a0)        ; 2
  336.         move.w    #2,(bltbmod,a0)        ; 2
  337.         move.w    #$cccc,(bltcdat,a0)
  338.         move.l    #$0DE42000,(bltcon0,a0)    ; D=AC+(B>>2)~C
  339.  
  340. ;        move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  341. ;blit31a:    cmp.l    #32768,d0        ; check for overflow blitter
  342. ;        bls.b    blit31c            ; branch if ok
  343. ;        move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  344. ;        move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  345. ;        move.w    #1,(bltsizh,a0)        ; do blit
  346. ;        lea    (blit31b,pc),a0
  347. ;        move.l    a0,(qblitfunc-mybltnode,a1)
  348. ;        rts
  349. ;
  350. ;blit31b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  351. ;        sub.l    #32768,d0        ; subtract number already done
  352. ;        bra.b    blit31a            ; loop back
  353. ;
  354. ;blit31c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  355.  
  356.         move.w    (pixels4+2-mybltnode,a1),(bltsizv,a0) ; pixels/4
  357.  
  358.         move.w    #1,(bltsizh,a0)        ;do blit
  359.         lea    (blit32,pc),a0
  360.         move.l    a0,(qblitfunc-mybltnode,a1)
  361.         rts
  362.  
  363. ;Pass 3, subpass 2
  364. ;    apt        Buff2+Pixels-2-2
  365. ;    bpt        Buff2+Pixels-2
  366. ;    dpt        Buff3+Pixels-2
  367. ;    amod        2
  368. ;    bmod        2
  369. ;    dmod        0
  370. ;    cdat        $cccc
  371. ;    sizv        Pixels/4
  372. ;    sizh        1 word
  373. ;    con        D=(A<<2)C+B~C, descending
  374.  
  375. blit32:        move.l    #buff2,d0
  376.         add.l    (pixels-mybltnode,a1),d0
  377.         subq.l    #2+2,d0
  378.         move.l    d0,(bltapt,a0)        ; buff2+pixels-2-2
  379.         addq.l    #2,d0
  380.         move.l    d0,(bltbpt,a0)        ; buff2+pixels-2
  381.         add.l    #buff3-buff2,d0
  382.         move.l    d0,(bltdpt,a0)        ; buff3+pixels-2
  383.         move.l    #$2DE40002,(bltcon0,a0)    ; D=(A<<2)C+B~C, desc.
  384.  
  385. ;        move.l    (pixels4-mybltnode,a1),d0    ; pixels/4
  386. ;blit32a:    cmp.l    #32768,d0        ; check for overflow blitter
  387. ;        bls.b    blit32c            ; branch if ok
  388. ;        move.l    d0,(sizv-mybltnode,a1)    ; else save (too big) bltsizv
  389. ;        move.w    #32768,(bltsizv,a0)    ; max possible bltsizv
  390. ;        move.w    #1,(bltsizh,a0)        ; do blit
  391. ;        lea    (blit32b,pc),a0
  392. ;        move.l    a0,(qblitfunc-mybltnode,a1)
  393. ;        rts
  394. ;
  395. ;blit32b:    move.l    (sizv-mybltnode,a1),d0    ; restore (too big) bltsizv
  396. ;        sub.l    #32768,d0        ; subtract number already done
  397. ;        bra.b    blit32a            ; loop back
  398. ;
  399. ;blit32c:    move.w    d0,(bltsizv,a0)        ; pixels/8
  400.  
  401.         move.w    #1,(bltsizh,a0)        ;do blit
  402.     IFGT depth-6
  403.         lea    (blit47,pc),a0
  404.     ELSE
  405.         lea    (blit43,pc),a0
  406.     ENDC
  407.         move.l    a0,(qblitfunc-mybltnode,a1)
  408.         rts
  409.  
  410. ;-------------------------------------------------
  411. ;buff3 after pass 3
  412. ;0        a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6
  413. ;2        q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  414. ;
  415. ;Pixels/8+0    b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6
  416. ;Pixels/8+2    r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  417. ;
  418. ;Pixels/4+0    a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2
  419. ;Pixels/4+2    q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  420. ;
  421. ;3*Pixels/8+0    b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2
  422. ;3*Pixels/8+2    r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  423. ;
  424. ;Pixels/2+0    a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4
  425. ;Pixels/2+2    q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  426. ;
  427. ;5*Pixels/8+0    b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4
  428. ;5*Pixels/8+2    r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  429. ;
  430. ;3*Pixels/4+0    a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0
  431. ;3*Pixels/4+2    q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  432. ;
  433. ;7*Pixels/8+0    b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0
  434. ;7*Pixels/8+2    r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  435. ;-------------------------------------------------
  436.  
  437.     IFGT depth-6
  438.  
  439. ;Pass 4, plane 7
  440. ;    apt        Buff3+0*pixels/8
  441. ;    bpt        Buff3+1*pixels/8
  442. ;    dpt        Plane7+offset
  443. ;    amod        0
  444. ;    bmod        0
  445. ;    dmod        0
  446. ;    cdat        $aaaa
  447. ;    sizv        Pixels/16
  448. ;    sizh        1 word
  449. ;    con        D=AC+(B>>1)~C, ascending
  450.  
  451. blit47:        movem.l    a2,-(sp)
  452.  
  453.         move.w    #0,(bltamod,a0)
  454.         move.w    #0,(bltbmod,a0)
  455.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  456.         move.w    #$aaaa,(bltcdat,a0)
  457.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  458.  
  459.         move.l    #buff3,d0
  460.         move.l    d0,(bltapt,a0)        ; buff3+0*pixels/8
  461.         add.l    (pixels8-mybltnode,a1),d0
  462.         move.l    d0,(bltbpt,a0)        ; buff3+1*pixels/8
  463.         move.l    (planes-mybltnode,a1),a2
  464.         move.l    (7*4,a2),d0
  465.         add.l    (offset-mybltnode,a1),d0
  466.         move.l    d0,(bltdpt,a0)        ; Plane7+offset
  467.         move.w    #1,(bltsizh,a0)        ;plane 7
  468.  
  469.         movem.l    a1/a6,-(sp)
  470.         move.l    (signals1-mybltnode,a1),d0
  471.         move.l    (task-mybltnode,a1),a1
  472.         move.l    (4).w,a6        ; a6->SysBase
  473.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  474.         movem.l    (sp)+,a1/a6
  475.  
  476.         lea    (blit43,pc),a0
  477.         move.l    a0,(qblitfunc-mybltnode,a1)
  478.         movem.l    (sp)+,a2
  479.         rts
  480.  
  481. ;-------------------------------------------------
  482. ;Plane7        a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7
  483. ;Plane7+2    q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  484. ;-------------------------------------------------
  485.  
  486.     ENDC
  487.  
  488. ;Pass 4, plane 3
  489. ;    apt        buff3+2*pixels/8
  490. ;    bpt        buff3+3*pixels/8
  491. ;    dpt        Plane3+offset
  492. ;    amod        0
  493. ;    bmod        0
  494. ;    dmod        0
  495. ;    cdat        $aaaa
  496. ;    sizv        pixels/16
  497. ;    sizh        1 word
  498. ;    con        D=AC+(B>>1)~C, ascending
  499.  
  500. blit43:        move.l    a2,-(sp)        ; preserve a2
  501.     IFLE depth-6
  502.         move.w    #0,(bltamod,a0)
  503.         move.w    #0,(bltbmod,a0)
  504.         move.w    (pixels16+2-mybltnode,a1),(bltsizv,a0)    ; pixels/16
  505.         move.w    #$aaaa,(bltcdat,a0)
  506.         move.l    #$0DE41000,(bltcon0,a0)    ; D=AC+(B>>1)~C
  507.     ENDC
  508.         move.l    #buff3,d0
  509.         add.l    (pixels4-mybltnode,a1),d0
  510.         move.l    d0,(bltapt,a0)        ; buff3+2*pixels/8
  511.         add.l    (pixels8-mybltnode,a1),d0
  512.         move.l    d0,(bltbpt,a0)        ; buff3+3*pixels/8
  513.         move.l    (planes-mybltnode,a1),a2
  514.         move.l    (3*4,a2),d0
  515.         add.l    (offset-mybltnode,a1),d0
  516.         move.l    d0,(bltdpt,a0)        ; Plane3+offset
  517.         move.w    #1,(bltsizh,a0)        ;plane 3
  518.     IFLE depth-6
  519.         movem.l    a1/a6,-(sp)
  520.         move.l    (signals1-mybltnode,a1),d0
  521.         move.l    (task-mybltnode,a1),a1
  522.         move.l    (4).w,a6        ; a6->SysBase
  523.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  524.         movem.l    (sp)+,a1/a6
  525.     ENDC
  526.         lea    (blit45,pc),a0
  527.         move.l    a0,(qblitfunc-mybltnode,a1)
  528.         move.l    (sp)+,a2        ; restore a2
  529.         rts
  530.  
  531. ;-------------------------------------------------
  532. ;Plane3        a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3
  533. ;Plane3+2    q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  534. ;-------------------------------------------------
  535.  
  536. ;Pass 4, plane 5
  537. ;    apt        buff3+4*pixels/8
  538. ;    bpt        buff3+5*pixels/8
  539. ;    dpt        Plane5+offset
  540. ;    amod        0
  541. ;    bmod        0
  542. ;    dmod        0
  543. ;    cdat        $aaaa
  544. ;    sizv        pixels/16
  545. ;    sizh        1 word
  546. ;    con        D=AC+(B>>1)~C, ascending
  547.  
  548. blit45:        move.l    a2,d1            ; preserve a2
  549.         move.l    #buff3,d0
  550.         add.l    (pixels2-mybltnode,a1),d0
  551.         move.l    d0,(bltapt,a0)        ; buff3+4*pixels/8
  552.         add.l    (pixels8-mybltnode,a1),d0
  553.         move.l    d0,(bltbpt,a0)        ; buff3+5*pixels/8
  554.         move.l    (planes-mybltnode,a1),a2
  555.         move.l    (5*4,a2),d0
  556.         add.l    (offset-mybltnode,a1),d0
  557.         move.l    d0,(bltdpt,a0)        ; Plane5+offset
  558.         move.w    #1,(bltsizh,a0)        ;plane 5
  559.         lea    (blit41,pc),a0
  560.         move.l    a0,(qblitfunc-mybltnode,a1)
  561.         move.l    d1,a2            ; restore a2
  562.         rts
  563.  
  564. ;-------------------------------------------------
  565. ;Plane5        a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5
  566. ;Plane5+2    q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  567. ;-------------------------------------------------
  568.  
  569. ;Pass 4, plane 1
  570. ;    apt        buff3+6*pixels/8
  571. ;    bpt        buff3+7*pixels/8
  572. ;    dpt        Plane1+offset
  573. ;    amod        0
  574. ;    bmod        0
  575. ;    dmod        0
  576. ;    cdat        $aaaa
  577. ;    sizv        pixels/16
  578. ;    sizh        1 word
  579. ;    con        D=AC+(B>>1)~C, ascending
  580.  
  581. blit41:        move.l    a2,d1            ; preserve a2
  582.         move.l    #buff3,d0
  583.         add.l    (pixels4-mybltnode,a1),d0
  584.         add.l    (pixels2-mybltnode,a1),d0
  585.         move.l    d0,(bltapt,a0)        ; buff3+6*pixels/8
  586.         add.l    (pixels8-mybltnode,a1),d0
  587.         move.l    d0,(bltbpt,a0)        ; buff3+7*pixels/8
  588.         move.l    (planes-mybltnode,a1),a2
  589.         move.l    (1*4,a2),d0
  590.         add.l    (offset-mybltnode,a1),d0
  591.         move.l    d0,(bltdpt,a0)        ; Plane1+offset
  592.         move.w    #1,(bltsizh,a0)        ;plane 1
  593.     IFGT depth-6
  594.         lea    (blit46,pc),a0
  595.     ELSE
  596.         lea    (blit42,pc),a0
  597.     ENDC
  598.         move.l    a0,(qblitfunc-mybltnode,a1)
  599.         move.l    d1,a2            ; restore a2
  600.         rts
  601.  
  602. ;-------------------------------------------------
  603. ;Plane1        a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1
  604. ;Plane1+2    q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  605. ;-------------------------------------------------
  606.  
  607.     IFGT depth-6
  608.  
  609. ;Pass 4, plane 6
  610. ;    apt        buff3+1*pixels/8-2
  611. ;    bpt        buff3+2*pixels/8-2
  612. ;    dpt        Plane6+plsiz-2+offset
  613. ;    amod        0
  614. ;    bmod        0
  615. ;    dmod        0
  616. ;    cdat        $aaaa
  617. ;    sizv        pixels/16
  618. ;    sizh        1 word
  619. ;    con        D=(A<<1)C+B~C, descending
  620.  
  621. blit46:        move.l    a2,d1            ; preserve a2
  622.         move.l    #buff3,d0
  623.         add.l    (pixels8-mybltnode,a1),d0
  624.         subq.l    #2,d0
  625.         move.l    d0,(bltapt,a0)        ; buff3+1*pixels/8-2
  626.         add.l    (pixels8-mybltnode,a1),d0
  627.         move.l    d0,(bltbpt,a0)        ; buff3+2*pixels/8-2
  628.         move.l    (planes-mybltnode,a1),a2
  629.         move.l    (6*4,a2),d0
  630.         add.l    (offset-mybltnode,a1),d0
  631.         add.l    (pixels8-mybltnode,a1),d0
  632.         subq.l    #2,d0
  633.         move.l    d0,(bltdpt,a0)        ; Plane6+offset+plsiz-2
  634.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  635.         move.w    #1,(bltsizh,a0)        ;plane 6
  636.         lea    (blit42,pc),a0
  637.         move.l    a0,(qblitfunc-mybltnode,a1)
  638.         move.l    d1,a2            ; restore a2
  639.         rts
  640.  
  641. ;-------------------------------------------------
  642. ;Plane6        a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6
  643. ;Plane6+2    q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  644. ;-------------------------------------------------
  645.  
  646.     ENDC
  647.  
  648. ;Pass 4, plane 2
  649. ;    apt        buff3+3*pixels/8-2
  650. ;    bpt        buff3+4*pixels/8-2
  651. ;    dpt        Plane2+plsiz-2+offset
  652. ;    amod        0
  653. ;    bmod        0
  654. ;    dmod        0
  655. ;    cdat        $aaaa
  656. ;    sizv        pixels/16
  657. ;    sizh        1 word
  658. ;    con        D=(A<<1)C+B~C, descending
  659.  
  660. blit42:        move.l    a2,d1            ; preserve a2
  661.         move.l    #buff3,d0
  662.         add.l    (pixels2-mybltnode,a1),d0
  663.         subq.l    #2,d0
  664.         move.l    d0,(bltbpt,a0)        ; buff3+4*pixels/8-2
  665.         sub.l    (pixels8-mybltnode,a1),d0
  666.         move.l    d0,(bltapt,a0)        ; buff3+3*pixels/8-2
  667.         move.l    (planes-mybltnode,a1),a2
  668.         move.l    (2*4,a2),d0
  669.         add.l    (offset-mybltnode,a1),d0
  670.         add.l    (pixels8-mybltnode,a1),d0
  671.         subq.l    #2,d0
  672.         move.l    d0,(bltdpt,a0)        ; Plane2+offset+plsiz-2
  673.     IFLE depth-6
  674.         move.l    #$1DE40002,(bltcon0,a0)    ; D=(A<<1)C+B~C, desc.
  675.     ENDC
  676.         move.w    #1,(bltsizh,a0)        ;plane 2
  677.         lea    (blit44,pc),a0
  678.         move.l    a0,(qblitfunc-mybltnode,a1)
  679.         move.l    d1,a2            ; restore a2
  680.         rts
  681.  
  682. ;-------------------------------------------------
  683. ;Plane2        a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
  684. ;Plane2+2    q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  685. ;-------------------------------------------------
  686.  
  687. ;Pass 4, plane 4
  688. ;    apt        buff3+5*pixels/8-2
  689. ;    bpt        buff3+6*pixels/8-2
  690. ;    dpt        Plane4+plsiz-2+offset
  691. ;    amod        0
  692. ;    bmod        0
  693. ;    dmod        0
  694. ;    cdat        $aaaa
  695. ;    sizv        pixels/16
  696. ;    sizh        1 word
  697. ;    con        D=(A<<1)C+B~C, descending
  698.  
  699. blit44:        move.l    a2,d1            ; preserve a2
  700.         move.l    #buff3,d0
  701.         add.l    (pixels2-mybltnode,a1),d0
  702.         add.l    (pixels4-mybltnode,a1),d0
  703.         subq.l    #2,d0
  704.         move.l    d0,(bltbpt,a0)        ; buff3+6*pixels/8-2
  705.         sub.l    (pixels8-mybltnode,a1),d0
  706.         move.l    d0,(bltapt,a0)        ; buff3+5*pixels/8-2
  707.         move.l    (planes-mybltnode,a1),a2
  708.         move.l    (4*4,a2),d0
  709.         add.l    (offset-mybltnode,a1),d0
  710.         add.l    (pixels8-mybltnode,a1),d0
  711.         subq.l    #2,d0
  712.         move.l    d0,(bltdpt,a0)        ; Plane4+offset+plsiz-2
  713.         move.w    #1,(bltsizh,a0)        ;plane 4
  714.         lea    (blit40,pc),a0
  715.         move.l    a0,(qblitfunc-mybltnode,a1)
  716.         move.l    d1,a2            ; restore a2
  717.         rts
  718.  
  719. ;-------------------------------------------------
  720. ;Plane4        a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4
  721. ;Plane4+2    q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  722. ;-------------------------------------------------
  723.  
  724. ;Pass 4, plane 0
  725. ;    apt        buff3+7*pixels/8-2
  726. ;    bpt        buff3+8*pixels/8-2
  727. ;    dpt        Plane0+plsiz-2+offset
  728. ;    amod        0
  729. ;    bmod        0
  730. ;    dmod        0
  731. ;    cdat        $aaaa
  732. ;    sizv        pixels/16
  733. ;    sizh        1 word
  734. ;    con        D=(A<<1)C+B~C, descending
  735.  
  736. blit40:        move.l    a2,d1            ; preserve a2
  737.         move.l    #buff3,d0
  738.         add.l    (pixels-mybltnode,a1),d0
  739.         subq.l    #2,d0
  740.         move.l    d0,(bltbpt,a0)        ; buff3+8*pixels/8-2
  741.         sub.l    (pixels8-mybltnode,a1),d0
  742.         move.l    d0,(bltapt,a0)        ; buff3+7*pixels/8-2
  743.         move.l    (planes-mybltnode,a1),a2
  744.         move.l    (a2),d0
  745.         add.l    (offset-mybltnode,a1),d0
  746.         add.l    (pixels8-mybltnode,a1),d0
  747.         subq.l    #2,d0
  748.         move.l    d0,(bltdpt,a0)        ; Plane0+offset+plsiz-2
  749.         move.w    #1,(bltsizh,a0)        ;plane 0
  750.         lea    (blit31,pc),a0
  751.         move.l    a0,(qblitfunc-mybltnode,a1)
  752.         move.l    d1,a2            ; restore a2
  753.         moveq    #0,d0            ; set Z flag
  754.         rts
  755.  
  756. ;-------------------------------------------------
  757. ;Plane0        a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
  758. ;Plane0+2    q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  759. ;-------------------------------------------------
  760.  
  761. qblitcleanup:    movem.l    a2/a6,-(sp)
  762.         move.l    #mybltnode,a2
  763.         move.l    (task-mybltnode,a2),a1    ; signal QBlit() has finished
  764.         move.l    (signals2-mybltnode,a2),d0
  765.         move.l    (4).w,a6
  766.         jsr    (_LVOSignal,a6)        ; may be called from interrupts
  767.         move.l    (othertask-mybltnode,a2),a1
  768.         move.l    (signals3-mybltnode,a2),d0
  769.         jsr    (_LVOSignal,a6)        ; signal pass 3 has finished
  770.         movem.l    (sp)+,a2/a6
  771.         rts
  772.  
  773. ;-----------------------------------------------------------------------------
  774.         section    data,data
  775.  
  776.         quad
  777. mybltnode:    dc.l    0        ; next bltnode
  778. qblitfunc:    dc.l    blit31        ; ptr to qblitfunc()
  779.         dc.b    cleanup        ; stat
  780.         dc.b    0        ; filler
  781.         dc.w    0        ; blitsize
  782.         dc.w    0        ; beamsync
  783.         dc.l    qblitcleanup    ; ptr to qblitcleanup()
  784.  
  785.         quad
  786. chunky:        dc.l    0        ; ptr to original chunky data
  787. planes:        dc.l    0        ; ptr to list of output plane ptrs
  788. pixels:        dc.l    0        ; width*height
  789. pixels2:    dc.l    0        ; width*height/2
  790. pixels4:    dc.l    0        ; width*height/4
  791. pixels8:    dc.l    0        ; width*height/8
  792. pixels16:    dc.l    0        ; width*height/16
  793. offset:        dc.l    0        ; byte offset into plane
  794. task:        dc.l    0        ; ptr to this task
  795. othertask:    dc.l    0        ; ptr to other task
  796. signals1:    dc.l    0        ; signals to Signal() task after pass 3
  797. signals2:    dc.l    0        ; signals to Signal() task at cleanup
  798. signals3:    dc.l    0        ; signals to Signal() othertask at cleanup
  799. ;sizv        dc.l    0
  800. xlate:        dc.l    0
  801. force_update:    dc.w    0
  802.  
  803. ;-----------------------------------------------------------------------------
  804.         section    segment1,bss,chip        ; MUST BE IN CHIP !!!!!
  805.  
  806. buff2        ds.b    maxpixels    ;Intermediate buffer 2
  807. buff3        ds.b    maxpixels    ;Intermediate buffer 3
  808.  
  809. ;-----------------------------------------------------------------------------
  810.  
  811.         end
  812.